home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / fido / mmail.000 / mmail / mmail.0.1 / interface / interface.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-27  |  12.2 KB  |  527 lines

  1. /*
  2.  * MultiMAIL offline mail reader
  3.  * 
  4.  
  5.    Written by Kolossvary Tamas (thomas@vma.bme.hu)
  6.  
  7.    This program is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 2, or (at your option)
  10.    any later version.
  11.  
  12.    This program is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with this program; if not, write to the Free Software
  19.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. #include "interface.h"
  22.  
  23. extern Welcome             welcome;
  24. extern PacketListWindow     packets;
  25. extern AreaListWindow        areas;
  26. extern LetterListWindow     letters;
  27. extern LetterWindow         letterwindow;
  28. extern HelpWindow         helpwindow;
  29. extern mmail            mm;
  30. extern packet_list         *packetList;
  31. extern area_list         *areaList;
  32. extern letter_list        *letterList;
  33. extern Interface         *interface;
  34. extern LittleAreaListWindow        *littleareas;
  35. extern AddressBook        addresses;
  36.  
  37. Interface :: Interface(int mode)
  38. {
  39.  screen_init(mode);
  40.  letterwindow.set_columns(COLS);
  41.  welcome.MakeActive();
  42.  packets.MakeActive();
  43.  state = packetlist;
  44.  dontcallEnterLetter = 0;
  45.  unsaved_reply = 0;
  46.  doupdate();
  47. }
  48.  
  49. statetype Interface :: active(void)
  50. {
  51.  return state;
  52. }
  53.  
  54. void Interface :: select(void)
  55. {
  56.  switch(state)
  57.  {
  58.     case packetlist: packets.Delete();
  59.              welcome.Delete();
  60.              erase();
  61.              refresh();
  62.              mm.selectPacket(packetList->getName());
  63.              clearok(screen, TRUE);
  64.              touchwin(screen);
  65.              wnoutrefresh(screen);
  66.               areas.MakeActive();
  67.              areas.FirstUnread();
  68.              state=arealist;
  69.              break;
  70.      case arealist:     if(mm.areaList->getNoOfLetters() > 0)
  71.              {
  72.               areas.Delete();
  73.               letters.MakeActive();
  74.               letters.FirstUnread();
  75.               state=letterlist;
  76.              }
  77.              break;
  78.     case letterlist: letters.Delete();
  79.              letterwindow.MakeActive();
  80.              state=letter;
  81.              break;
  82.     case threadlist: break;
  83.     case letter:     letterwindow.Next(); break;
  84.     case letter_help:helpwindow.Delete();
  85.              letterwindow.Draw();
  86.               state=letter;
  87.              break;
  88.     case littlearealist: delete littleareas;
  89.                  if(strcmp(mm.areaList->getShortName(), "NET") == 0)
  90.                 if((Key == 'N') || (Key == 'E'))
  91.                         addresses.MakeActive();
  92.                 else
  93.                 {
  94.                     net_address nm;
  95.  
  96.                     nm = letterwindow.PickNetAddr();
  97.                     letterwindow.set_Letter_Params(&nm,
  98.                                     NULL);
  99.                 }
  100.                  Key = '\0';
  101.                              areas.Reset_areaList(); 
  102.                  letterwindow.ReDraw();
  103.                  state = letter;
  104.                              if(!dontcallEnterLetter)
  105.                 letterwindow.EnterLetter();                    
  106.                  else
  107.                 dontcallEnterLetter = 0;
  108.                  break;
  109.  }
  110. }
  111.  
  112. int Interface :: back(void)
  113. {
  114.  switch(state)
  115.  {
  116.     case packetlist: if(WarningWindow("Do You really want to quit?",
  117.                        "Yes", "No"))
  118.              {
  119.               
  120.                packets.Delete();
  121.                welcome.Delete();
  122.                return 1;
  123.              }
  124.              else
  125.              { 
  126.                 touchwin(screen);
  127.                 wnoutrefresh(screen);
  128.                 welcome.ReDraw();
  129.                 packets.ReDraw();
  130.                 helpwindow.redraw();
  131.                 return 0;
  132.              }
  133.     case arealist:     if(WarningWindow("Save Lastread Pointers?", "Yes", "No"))
  134.                         mm.saveRead(); 
  135.                     if(unsaved_reply)
  136.                 if(WarningWindow("The content of the reply area has changed. Create new packet?",
  137.                          "Yes", "No"))
  138.                     create_reply_packet();                
  139.              areas.Delete();
  140.              packets.MakeActive();
  141.              welcome.MakeActive();
  142.              state=packetlist;
  143.              break;
  144.     case letterlist: letters.Delete();
  145.              areas.MakeActive();
  146.              state=arealist;
  147.              break;
  148.     case threadlist: break;
  149.     case letter:      letterwindow.Delete();
  150.              letters.MakeActive();
  151.              letters.Draw();
  152.              state=letterlist;
  153.              break;
  154.     case letter_help:helpwindow.Delete();
  155.              letterwindow.Draw();
  156.               state=letter;
  157.              break;
  158.     case littlearealist: delete littleareas;
  159.                  areas.Reset_areaList();
  160.                  state = letter;
  161.                  break;
  162.  }
  163.  return 0;
  164. }
  165.  
  166. void Interface :: ReplyPacket(void)
  167. {
  168.  if(state == arealist)
  169.  {
  170.   if(WarningWindow("This will overwrite existing reply packet. Continue?",
  171.            "Yes", "No"))
  172.   {
  173.     create_reply_packet();
  174.   }
  175.   else
  176.     areas.ReDraw();
  177.  }
  178. }
  179.  
  180. void Interface :: create_reply_packet(void)
  181. {
  182.     erase();
  183.     refresh();
  184.     mm.areaList->makeReply(REPLY_AREA);
  185.     unsaved_reply = 0;
  186.     clearok(screen, TRUE);
  187.         touchwin(screen);
  188.         wnoutrefresh(screen);
  189.     areas.ReDraw();
  190.     helpwindow.redraw();
  191. }
  192.  
  193. void Interface :: DOWN_ARROW(void)
  194. {
  195.  switch(state)
  196.  {
  197.     case packetlist: packets.Move(DOWN); packets.Draw(); break;
  198.     case arealist:      areas.Move(DOWN); areas.Draw(); break;
  199.     case letterlist: letters.Move(DOWN); letters.Draw(); break;
  200.     case threadlist: break;
  201.     case letter:     letterwindow.Move(DOWN); break;
  202.     case letter_help:helpwindow.Delete();
  203.              letterwindow.Draw();
  204.               state=letter;
  205.              break;
  206.     case littlearealist: littleareas->Move(DOWN);
  207.                  littleareas->Draw();
  208.                  break;
  209.  }
  210. }
  211.  
  212. void Interface :: UP_ARROW(void)
  213. {
  214.  switch(state)
  215.  {    
  216.     case packetlist: packets.Move(UP); packets.Draw(); break;
  217.     case arealist:     areas.Move(UP); areas.Draw(); break;
  218.     case letterlist: letters.Move(UP); letters.Draw(); break;
  219.     case threadlist: break;
  220.     case letter:     letterwindow.Move(UP); break;
  221.     case letter_help:helpwindow.Delete();
  222.              letterwindow.Draw();
  223.               state=letter;
  224.              break;
  225.     case littlearealist: littleareas->Move(UP);
  226.                  littleareas->Draw();
  227.                  break;
  228.  }    
  229. }
  230.  
  231. void Interface :: RIGHT_ARROW(void)
  232. {
  233.  switch(state)
  234.  {    
  235.     case packetlist: packets.Move(DOWN); packets.Draw(); break;
  236.     case arealist:     do
  237.              {
  238.                 areas.Move(DOWN); areas.Draw(); 
  239.              } while((mm.areaList->getNoOfLetters() == 0) &&
  240.                 (mm.areaList->getAreaNo() < mm.areaList->noOfAreas()));
  241.              if (mm.areaList->getAreaNo() == mm.areaList->noOfAreas() &&
  242.                 (mm.areaList->getNoOfLetters() == 0))
  243.                 this->UP_ARROW();
  244.              break;
  245.     case letterlist: letters.Move(DOWN); letters.Draw(); break;
  246.     case threadlist: break;
  247.     case letter:     letterwindow.Next(); break;
  248.     case letter_help:helpwindow.Delete();
  249.              letterwindow.Draw();
  250.               state=letter;
  251.              break;
  252.     case littlearealist: littleareas->Move(DOWN);
  253.                  littleareas->Draw();
  254.                  break;
  255.  }    
  256. }
  257.  
  258. void Interface :: LEFT_ARROW(void)
  259. {
  260.  switch(state)
  261.  {    
  262.     case packetlist: packets.Move(UP); packets.Draw(); break;
  263.     case arealist:     do
  264.              {
  265.                 areas.Move(UP); areas.Draw(); 
  266.              } while((mm.areaList->getNoOfLetters() == 0) &&
  267.                 (mm.areaList->getAreaNo() > 1));
  268.              if((mm.areaList->getAreaNo() == 1) && 
  269.                (mm.areaList->getNoOfLetters() == 0))
  270.                 this->DOWN_ARROW();
  271.              break;
  272.     case letterlist: letters.Move(UP); letters.Draw(); break;
  273.     case threadlist: break;
  274.     case letter:     letterwindow.Previous(); break;
  275.     case letter_help:helpwindow.Delete();
  276.              letterwindow.Draw();
  277.               state=letter;
  278.              break;
  279.     case littlearealist: littleareas->Move(UP);
  280.                  littleareas->Draw();
  281.                  break;
  282.  }    
  283. }
  284. void Interface :: HOME_KEY(void)
  285. {
  286.  switch(state)
  287.  {
  288.     case packetlist: packets.Move(HOME); packets.Draw(); break;
  289.     case arealist:   areas.Move(HOME); areas.Draw(); break;
  290.     case letterlist: letters.Move(HOME); letters.Draw(); break;
  291.     case threadlist: break;
  292.     case letter:     letterwindow.Move(HOME); break;
  293.     case letter_help:helpwindow.Delete();
  294.              letterwindow.Draw();
  295.               state=letter;
  296.              break;
  297.     case littlearealist: littleareas->Move(HOME);
  298.                  littleareas->Draw();
  299.                  break;
  300.  }
  301. }
  302.  
  303. void Interface :: END_KEY(void)
  304. {
  305.  switch(state)
  306.  {
  307.     case packetlist: packets.Move(END); packets.Draw(); break;
  308.     case arealist:   areas.Move(END); areas.Draw(); break;
  309.     case letterlist: letters.Move(END); letters.Draw(); break;
  310.     case threadlist: break;
  311.     case letter:     letterwindow.Move(END); break;
  312.     case letter_help:helpwindow.Delete();
  313.              letterwindow.Draw();
  314.               state=letter;
  315.              break;
  316.     case littlearealist: littleareas->Move(END);
  317.                  littleareas->Draw();
  318.                  break;
  319.  }
  320. }
  321. void Interface :: PGUP_KEY(void)
  322. {
  323.  switch(state)
  324.  {
  325.     case packetlist: packets.Move(PGUP); packets.Draw(); break;
  326.     case arealist:   areas.Move(PGUP); areas.Draw(); break;
  327.     case letterlist: letters.Move(PGUP); letters.Draw(); break;
  328.     case threadlist: break;
  329.     case letter:     letterwindow.Move(PGUP); break;
  330.     case letter_help:helpwindow.Delete();
  331.              letterwindow.Draw();
  332.               state=letter;
  333.              break;
  334.     case littlearealist: littleareas->Move(PGUP);                 
  335.                  littleareas->Draw();
  336.                  break;
  337.  }
  338. }
  339. void Interface :: PGDN_KEY(void)
  340. {
  341.  switch(state)
  342.  {
  343.     case packetlist: packets.Move(PGDN); packets.Draw(); break;
  344.     case arealist:   areas.Move(PGDN); areas.Draw(); break;
  345.     case letterlist: letters.Move(PGDN); letters.Draw(); break;
  346.     case threadlist: break;
  347.     case letter:     letterwindow.Move(PGDN); break;
  348.     case letter_help:helpwindow.Delete();
  349.              letterwindow.Draw();
  350.               state=letter;
  351.              break;
  352.     case littlearealist: littleareas->Move(PGDN);
  353.                  littleareas->Draw();
  354.                  break;
  355.  }
  356. }
  357.  
  358. void Interface :: help(void)
  359. {
  360.  switch(state)
  361.  {
  362.     case packetlist: break;
  363.     case arealist: break;
  364.     case letterlist: break;
  365.     case threadlist: break;
  366.     case letter: if(mm.areaList->getType() != bwrep)
  367.                  helpwindow.letter(); 
  368.              else 
  369.             helpwindow.reply_area_letter();
  370.              state=letter_help; 
  371.              break;
  372.     case letter_help: helpwindow.Delete();
  373.               letterwindow.Draw();
  374.                state=letter;
  375.               break;
  376.     case littlearealist: break;
  377.  }
  378. }
  379.  
  380. void Interface :: enterletter(char key)
  381. {
  382.  switch(state)
  383.  {
  384.     case packetlist: break;
  385.     case arealist:   if((mm.areaList->getType() != bwrep) && (key == 'E'))
  386.              {
  387.                 if(strcmp(mm.areaList->getShortName(), "NET") != 0)
  388.                 {    
  389.                     letterwindow.set_Letter_Params(
  390.                         mm.areaList->getAreaNo(), 'E');
  391.                     letterwindow.EnterLetter();
  392.                     unsaved_reply = 1;
  393.                 }
  394.                 else
  395.                 {
  396.                     addresses.MakeActive();
  397.                     letterwindow.set_Letter_Params(
  398.                         mm.areaList->getAreaNo(), 'E');
  399.                      if(!dontcallEnterLetter)
  400.                         letterwindow.EnterLetter();
  401.                     else
  402.                         dontcallEnterLetter = 0;
  403.                 }
  404.              }
  405.              break;
  406.     case letterlist: if((mm.areaList->getType() != bwrep) && (key == 'E'))
  407.              {
  408.                 if(strcmp(mm.areaList->getShortName(), "NET") != 0)
  409.                 {
  410.                     letterwindow.set_Letter_Params(
  411.                         mm.areaList->getAreaNo(), 'E');
  412.                     letterwindow.EnterLetter();
  413.                     unsaved_reply = 1;
  414.                 }
  415.                 else
  416.                 {
  417.                     addresses.MakeActive();
  418.                     letterwindow.set_Letter_Params(
  419.                         mm.areaList->getAreaNo(), 'E');
  420.                      if(!dontcallEnterLetter)
  421.                         letterwindow.EnterLetter();
  422.                     else
  423.                         dontcallEnterLetter = 0;
  424.                 }
  425.              }
  426.              break;
  427.     case threadlist: break;
  428.     case letter: if((mm.areaList->getType() != bwrep) && (key != 'N'))
  429.              {
  430.                   Key = key;
  431.             littleareas = new LittleAreaListWindow(key);
  432.                  state = littlearealist;
  433.             unsaved_reply = 1;
  434.              }
  435.              if((mm.areaList->getType() != bwrep) && (key == 'N'))
  436.              {
  437.             net_address nm;
  438.         
  439.             Key = key;
  440.             nm = letterwindow.PickNetAddr();
  441.             letterwindow.set_Letter_Params(0, 'N');
  442.             letterwindow.set_Letter_Params(&nm, NULL);    
  443.             letterwindow.EnterLetter();
  444.             unsaved_reply = 1;
  445.              }
  446.              break;
  447.     case letter_help: helpwindow.Delete();
  448.               letterwindow.Draw();
  449.                state=letter;
  450.               break;
  451.     case littlearealist: break;
  452.  }
  453. }
  454.  
  455. void Interface :: save(void)
  456. {
  457.  switch(state)
  458.  {
  459.     case packetlist: break;
  460.     case arealist: break;
  461.     case letterlist: letters.Save(); 
  462.              break;
  463.     case threadlist: break;
  464.     case letter: letterwindow.Save(); break;
  465.     case letter_help: helpwindow.Delete();
  466.               letterwindow.Draw();
  467.                state=letter;
  468.               break;
  469.     case littlearealist: break;
  470.  }
  471. }
  472.  
  473. void Interface :: search(void)
  474. {
  475. }
  476.  
  477. void Interface :: ANY_KEY(void)
  478. {
  479.  switch(state)
  480.  {
  481.     case packetlist: break;
  482.     case arealist: break;
  483.     case letterlist: break;
  484.     case threadlist: break;
  485.     case letter: break;
  486.     case letter_help: helpwindow.Delete();
  487.               letterwindow.Draw();
  488.                state=letter;
  489.               break;
  490.     case littlearealist: break;
  491.  }
  492. }
  493.  
  494. void Interface :: kill(void)
  495. {
  496.  if(state == letter && mm.areaList->getType() == bwrep)
  497.  {
  498.   if(WarningWindow("Are You sure you want to delete this letter?",
  499.            "Yes", "No"))
  500.   {
  501.     mm.areaList->killLetter(letterList->getLetterID());
  502.     unsaved_reply = 1;
  503.      back();
  504.     if(mm.areaList->getNoOfLetters() == 0) 
  505.         back();
  506.     else
  507.         UP_ARROW();
  508.  
  509.   }
  510.   else
  511.     letterwindow.ReDraw();
  512.  }
  513. }
  514.  
  515. void Interface :: addressbook(void)
  516. {
  517.  if(state != littlearealist)
  518.  {
  519.     addresses.MakeActive(1); //1 means NOENTER 
  520.  }
  521. }
  522.  
  523. void Interface :: set_dontcallEnterLetter(void)
  524. {
  525.  dontcallEnterLetter = 1;
  526. }
  527.